

package main.new_2024.month_05;


import java.util.*;
import java.util.stream.Collectors;

/**
 * @Description: todo 1657. 确定两个字符串是否接近
 * 如果可以使用以下操作从一个字符串得到另一个字符串，则认为两个字符串 接近 ：
 * 操作 1：交换任意两个 现有 字符。
 * 例如，abcde -> aecdb
 * 操作 2：将一个 现有 字符的每次出现转换为另一个 现有 字符，并对另一个字符执行相同的操作。
 * 例如，aacabb -> bbcbaa（所有 a 转化为 b ，而所有的 b 转换为 a ）
 * 你可以根据需要对任意一个字符串多次使用这两种操作。
 * 给你两个字符串，word1 和 word2 。如果 word1 和 word2 接近 ，就返回 true ；否则，返回 false 。
 *
 * todo 2352. 相等行列对
 * 给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ，返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。
 * 如果行和列以相同的顺序包含相同的元素（即相等的数组），则认为二者是相等的。
 *
 * @Author: Take-off
 * @Date: 1:00 PM 2024/2/27
 * @Param:
 * @return:
 **/
public class Solution0506 {
    //相等行列对
    public int equalPairs(int[][] grid) {
        int length = grid.length;
        //构建一个行列反转的二维数组，这样，行与列直接 equals
        int[][] column =new int[length][length];
        for (int i= 0;i<length;i++){
            for (int j=0;j<length;j++){
                column[i][j] = grid[j][i];
            }
        }
        int count = 0;
        for (int i= 0;i<length;i++){
            for (int j =0;j<length;j++){
                if (Arrays.equals(grid[i],column[j])){
                    count++;
                }
            }
        }
        return count;
    }

    //确定两个字符串是否接近
    public boolean closeStrings(String word1, String word2) {
        //判断三点：1.长度；2.字符类型;3.出现次数
        if (word1.length() != word2.length()){
            return false;
        }
        //存字符类型和次数
        Map<Character, Integer> map1 = new HashMap<>();
        Map<Character, Integer> map2 = new HashMap<>();
        for (int i = 0; i< word1.length();i++){
            char temp1 = word1.charAt(i);
            map1.put(temp1,map1.getOrDefault(temp1,0)+1);
            char temp2 = word2.charAt(i);
            map2.put(temp2,map2.getOrDefault(temp2,0)+1);
        }
        //字符类型
        List<Character> keySet1 = map1.keySet().stream().sorted().collect(Collectors.toList());
        List<Character> keySet2 = map2.keySet().stream().sorted().collect(Collectors.toList());
        if (keySet1.size() != keySet2.size()){
            return false;
        }else {
            for (int i = 0; i < keySet1.size(); i++) {
                if (!keySet1.get(i).equals(keySet2.get(i))){
                    return false;
                }
            }
        }
        //出现次数
        List<Integer> value1 = map1.values().stream().sorted().collect(Collectors.toList());
        List<Integer> value2 = map2.values().stream().sorted().collect(Collectors.toList());
        if (value1.size() != value2.size()){
            return false;
        }else {
            for (int i = 0; i < value1.size(); i++) {
                if (!value1.get(i).equals(value2.get(i))){
                    return false;
                }
            }
        }
        return true;
    }

    public static void main(String[] args) {

    }

}

